package main

import "fmt"

//1.1,检查接口类型变量的值是否实现了期望的接口。
//理解：
//* 很简单，就是检查当前接口类型的值有没有实现指定的某个具体的接口。
//1.2,把接口类型变量的值转换为其他类型或其他接口。
//理解：
//* 其实很好理解，go语言空interface{}可以保存任何类型的变量，
//当程序中需要使用该变量的时候，需要把接口类型变量的值转化为
//具体类型，可以通过接口类型断言。
//* 假如接口类型保存的值是数字，当前的值要参与数学运算，就必须
//转为int类型才可以参加运算，这就是利用接口断言来实现类型转换的例子。
//
//注意：
//被断言的对象必须是接口类型，否则会报错

type Inter interface {
	Ping()
	Pang()
}

type Anter interface {
	Inter
	String()
}

type St struct {
	Name string
}

func (St) Ping() {
	fmt.Printf("ping")
}

func (*St) Pang() {
	fmt.Println("pang")
}

func (St) String() {
	fmt.Println("String")
}

func main() {
	st := &St{"小明"}
	var i interface{} = st
	o := i.(Anter) //断言当前对象是否是Anter类型，不是的话会报错
	o.String()
	fmt.Println(o)
	fmt.Printf("类型：%T \n", o)

	if s, ok := i.(*St); ok { //断言当前对象是否是*St类型，不是的话会输出到ok里面
		fmt.Println(ok)
		fmt.Printf("im is %s", s.Name)
	}
}
